#ifndef     __HANDLER_TASK_H
#define     __HANDLER_TASK_H

#include "../rtos/thread.h"
#include "../utils/object.h"
#include "../utils/message.h"
#include "../rtos/message_queue.h"
#include "../rtos/timer.h"

namespace task {

class HandlerTask : public rtos::Thread<HandlerTask, 2048, osPriorityHigh2>
{

public: 
    static constexpr uint32_t ResetTimeout = 30 * 1000L;

    void run();

    inline osStatus_t post(const utils::message_t &msg) {
        return m_mq.post( msg );
    }

private:
    void on_test_tube(const utils::message_t &msg);
    void on_set_tube(const utils::message_t &msg);
    void on_test_fridge(const utils::message_t &msg);
    void on_set_fridge(const utils::message_t &msg);
    void on_test_compr(const utils::message_t &msg);
    void on_arm_adj(const utils::message_t &msg);
    void on_test_arm(const utils::message_t &msg);
    void on_arm_ctrl(const utils::message_t &msg);

    void on_auto_set_cargo(const utils::message_t &msg);
    void on_set_cargo(const utils::message_t &msg);
    void on_get_cargo(const utils::message_t &msg);
    void on_get_all_cargo(const utils::message_t &msg);

    void on_del_cargo(const utils::message_t &msg);
    void on_test_cargo(const utils::message_t &msg);
    void on_auto_set_pick(const utils::message_t &msg);
    void on_set_pick(const utils::message_t &msg);
    void on_get_param(const utils::message_t &msg);
    
    void on_open_lock(const utils::message_t &msg);
    void on_read_motor_driver(const utils::message_t &msg);
    void on_write_motor_driver(const utils::message_t &msg);

    void on_get_drv_status(const utils::message_t &msg);
    void on_clear_drv_status(const utils::message_t &msg);

    rtos::MessageQueue<utils::message_t, 10> m_mq;
};

inline utils::object_t<HandlerTask> handlerTask;

}



#endif
